#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/12/7 1:11
# @Author  : 唐松
# @File    : yaml_replace.py
# @Software: PyCharm

import json
import re
from common.debugtalk import DebugTalk
from util_tools.handle_data.yaml_handler import read_testcase_file


class YamlReplace:
    # 定义一个类YamlReplace, 用于处理yaml数据中的变量替换
    @classmethod
    def parse_replace(cls, yaml_data):
        """
        解析并替换yaml数据中变量引用, 如${get_extract_data(token)}
        :param yaml_data:  传入的yaml数据
        :return: 返回dict类型
        """
        # 将输入的数据转化为字符串格式, 如果输入的数据已经是字符串格式, 则直接返回, 否则将其转化为JSON格式的字符串
        yaml_data_str = yaml_data if isinstance(yaml_data, str) else json.dumps(yaml_data, ensure_ascii=False)
        # 循环处理yaml_data_str中的所有变量引用
        for _ in range(yaml_data_str.count('${')):
            if '${' in yaml_data_str and '}' in yaml_data_str:
                # 获取变量引用的开始位置
                start_index = yaml_data_str.index('${')
                # 获取变量引用的结束位置
                end_index = yaml_data_str.index('}', start_index)
                # 提取出需要替换的变量引用
                variable_data = yaml_data_str[start_index: end_index + 1]
                # print(f'需要替换的参数: {variable_data}')
                # 使用正则表达式提取函数名和参数
                match = re.match(r'\$\{(\w+)\((.*?)\)\}', variable_data)
                # 如果匹配成功, 则获取函数名和参数
                if match:
                    # 获取函数名和参数
                    func_name, func_args = match.groups()
                    # 将参数字符串分割成列表
                    func_args = func_args.split(',') if func_args else []
                    # 调用DebugTalk类中的相应方法, 并获取返回值
                    extract_data = getattr(DebugTalk(), func_name)(*func_args)
                    # print(f'替换后的函数: {extract_data}')
                    # 将返回值替换到原始字符串中
                    yaml_data_str = re.sub(re.escape(variable_data), str(extract_data), yaml_data_str)

        try:
            # 字符串解析为JSON对象
            data = json.loads(yaml_data_str)
        except json.JSONDecodeError:
            # 返回原始字符串
            data = yaml_data_str
        return data


if __name__ == '__main__':
    data = read_testcase_file('testcase/oms_product/oms_product.yaml')
    print(f'解析前的yaml: {data}')
    testcase = YamlReplace()
    res = testcase.parse_replace(data)
    print(f'解析后的yaml: {res}')
